package spark.core.broadcast

import org.apache.spark.broadcast.Broadcast
import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}

object Broadcast {
  // Todo 广播变量
  // 广播变量用来高效分发较大的对象。向所有工作节点发送一个较大的 只读值 ，以供一个或多个Spark操作使用。
  // 比如，如果你的应用需要向所有节点发送一个较大的只读查询表，广播变量用起来都很顺手。
  // 在多个并行操作中使用同一个变量，但是 Spark会为每个任务分别发送。
  def main(args: Array[String]): Unit = {

    val sparkConf: SparkConf = new SparkConf().setMaster("local[*]").setAppName("rddSerializable")
    val sc: SparkContext = new SparkContext(sparkConf)

    val rdd1 = sc.makeRDD(List(("a", 1), ("b", 2), ("c", 3), ("d", 4)), 4)
    val list = List(("a", 4), ("b", 5), ("c", 6), ("d", 7))

    // 声明广播变量
    val broadcast: Broadcast[List[(String, Int)]] = sc.broadcast(list)

    val resultRDD: RDD[(String, (Int, Int))] = rdd1.map {
      case (key, num) =>
        var num2 = 0
        // 使用广播变量\
        for (elem <- broadcast.value) {
          if (key == elem._1) num2 = elem._2
        }
//        for ((k, v) <- broadcast.value) {
//          if (k == key) {
//            num2 = v
//          }
//        }
        (key, (num, num2))
    }
    resultRDD.collect().foreach(println)
  }
}
